package com.cls.system.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import com.cls.common.entity.QueryRequest;
import com.cls.common.utils.FastDFSUtil;
import com.cls.common.utils.StringUtils;
import com.cls.system.entity.SysFile;
import com.cls.system.mapper.SysFileMapper;
import com.cls.system.service.ISysFileService;
import org.csource.common.MyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Propagation;
import lombok.RequiredArgsConstructor;
import com.github.pagehelper.PageHelper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.PageInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 系统附件 Service实现
 *
 * @author wmm
 * @date 2020-12-02 09:33:06
 */
@Service
@RequiredArgsConstructor
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements ISysFileService {

    @Override
    public void updateIsFinish(Long fileId, Long oldFileId) {
        if(fileId!=null && oldFileId!=null && fileId.equals(oldFileId)){
            return;
        }
        //如果就的文件id不为空则进行更新状态为false,让定时器进行fastDfs删除即可
        if (oldFileId != null) {
            SysFile sysFile = new SysFile();
            sysFile.setFileId(oldFileId);
            sysFile.setIsFinish(false);
            this.updateById(sysFile);
            this.removeById(oldFileId);
        }
        if (fileId != null) {
            SysFile sysFile = new SysFile();
            sysFile.setFileId(fileId);
            sysFile.setIsFinish(true);
            this.updateById(sysFile);
        }
    }

    @Override
    public SysFile uploadFile(MultipartFile file) throws IOException, MyException {
        return this.uploadFile(file, null);
    }

    @Override
    public SysFile uploadFile(MultipartFile file, String name) throws IOException, MyException {
        //获取文件名称
        if (StringUtils.isEmpty(name)) {
            name = FileUtil.getName(file.getOriginalFilename());
        }
        //上传fastDfs
        String url = FastDFSUtil.fileUpload(name, file.getBytes());
        //存入数据库
        SysFile sysFile = new SysFile();
        sysFile.setName(name);
        sysFile.setUrl(url);
        sysFile.setIsFinish(false);
        sysFile.setSuffix(FileUtil.extName(name));
        this.save(sysFile);
        return sysFile;
    }

    @Override
    public void download(Long fileId, HttpServletResponse response) throws IOException, MyException {
        // 创建输出流对象
        ServletOutputStream outputStream = response.getOutputStream();
        SysFile sysFile = this.getById(fileId);
        if (sysFile != null) {
            byte[] bytes = FastDFSUtil.fileDetail(sysFile.getUrl());
            // 设置返回内容格式
            response.setContentType("application/octet-stream");
            // 把文件名按UTF-8取出并按ISO8859-1编码，保证弹出窗口中的文件名中文不乱码
            // 中文不要太多，最多支持17个中文，因为header有150个字节限制。
            // 这一步一定要在读取文件之后进行，否则文件名会乱码，找不到文件
            String fileName = new String(sysFile.getName().getBytes("UTF-8"), "ISO8859-1");
            // 设置下载弹窗的文件名和格式（文件名要包括名字和文件格式）
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 返回数据到输出流对象中
            outputStream.write(bytes);
            // 关闭流对象
            IoUtil.close(outputStream);
        }
    }

    /**
     * 查询创建时间小于前天的时间且未完成的数据
     *
     * @return
     */
    @Override
    public List<SysFile> findNoFinishFile(Date date) {
        return this.baseMapper.findNoFinishFile(date);
    }

}
